import 'log_level.dart';

/// 日志样式配置。
///
/// 控制日志在控制台/终端中的显示效果，包括：
/// - 文本前景色（必选）；
/// - 背景色（可选）；
/// - 样式码（可选，如粗体、下划线等）。
class LogStyleConfig {
  /// 文本前景色（ANSI 30-37/90-97 等）。
  /// - 30: 黑色 (Black)
  /// - 31: 红色 (Red)
  /// - 32: 绿色 (Green)
  /// - 33: 黄色 (Yellow)
  /// - 34: 蓝色 (Blue)
  /// - 35: 品红色 (Magenta)
  /// - 36: 青色 (Cyan)
  /// - 37: 白色 (White)
  /// - 90: 亮黑色 (Bright Black)
  /// - 91: 亮红色 (Bright Red)
  /// - 92: 亮绿色 (Bright Green)
  /// - 93: 亮黄色 (Bright Yellow)
  /// - 94: 亮蓝色 (Bright Blue)
  /// - 95: 亮品红色 (Bright Magenta)
  /// - 96: 亮青色 (Bright Cyan)
  /// - 97: 亮白色 (Bright White)
  final int foreground;

  /// 背景色（ANSI 40-47/100-107 等）。
  /// 背景色（在颜色码基础上加10）：
  /// - 40-47: 标准背景色
  /// - 100-107: 亮背景色
  final int? background;

  /// 样式码集合（如 1=粗体，4=下划线，等）。
  ///
  /// - 0: 重置所有属性
  /// - 1: 粗体/高亮
  /// - 2: 弱化（降低亮度）
  /// - 3: 斜体
  /// - 4: 下划线
  /// - 5: 闪烁
  /// - 7: 反显
  /// - 8: 隐藏
  /// - 9: 删除线
  final List<int> styles;

  const LogStyleConfig({
    required this.foreground,
    this.background,
    this.styles = const [],
  });

  /// 生成 ANSI 起始转义序列，例如："\x1B[1;4;31;41m"。
  ///
  /// 顺序为：样式码 -> 前景色 -> 背景色，常见终端均可识别。
  String get ansiStartSequence {
    final codes = <int>[];
    if (styles.isNotEmpty) codes.addAll(styles);
    codes.add(foreground);
    if (background != null) codes.add(background!);
    return '\x1B[${codes.join(';')}m';
  }

  /// 重置所有样式的 ANSI 序列："\x1B[0m"。
  static const String ansiReset = '\x1B[0m';

  /// 从 JSON 创建配置。
  factory LogStyleConfig.fromJson(Map<String, dynamic> json) {
    return LogStyleConfig(
      foreground: json['foreground'] as int,
      background: json['background'] as int?,
      styles: (json['styles'] as List?)?.cast<int>() ?? const [],
    );
  }

  /// 转为 JSON。
  Map<String, dynamic> toJson() => {
        'foreground': foreground,
        'background': background,
        'styles': styles,
      };
}

/// 默认样式主题，按日志级别提供常用的颜色与样式。
const Map<LogLevel, LogStyleConfig> kDefaultLogStyles = {
  LogLevel.verbose: LogStyleConfig(
    foreground: 36,
    styles: [1],
  ), // 青色 弱化
  LogLevel.debug: LogStyleConfig(
    foreground: 32,
  ), // 绿色
  LogLevel.info: LogStyleConfig(
    foreground: 34,
    styles: [1],
  ), // 蓝色 粗体
  LogLevel.warn: LogStyleConfig(
    foreground: 33,
    background: 40,
    styles: [1],
  ), // 黄色 黑底 粗体
  LogLevel.error: LogStyleConfig(
    foreground: 37,
    background: 41,
    styles: [1, 4],
  ), // 红色 红底 粗体+下划线
};
